package br.unisinos.pdm;



import br.unisinos.pdm.bluetooth.BluetoothConnection;
import javax.microedition.lcdui.Canvas;
import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.Graphics;

/**
 * Ping Pong Bluetooth - classe que renderiza a tela do game
 *
 * @author  Daniel Correa
 * @version 1.0
 */
public class GameCanvas extends Canvas implements CommandListener, Runnable {

    //posicao dos jogadores na horizontal
    private int posicaoJogador1 = 0;
    private int posicaoJogador2 = 0;
    private int posicao1 = 0;
    private int posicao2 = 0;

    private int pontosJogador1 = 0;
    private int pontosJogador2 = 0;

    //posicao da bola na tela
    private int bolaX = 0;
    private int bolaY = 0;

    //controla o inicio da partida
    private boolean inicio = true;

    private BluetoothConnection btConnection;

    private boolean isServidor;

    private int tempoInicio = 1000000;

    public GameCanvas(boolean isServidor) {

        this.isServidor = isServidor;
        this.setFullScreenMode(true);
        this.setCommandListener(this);
        
    }

    public void iniciaJogo() {

        tempoInicio = 20;
    }

    public void setaPosicaoBola(int x, int y) {
        bolaX = x;
        bolaY = y;
    }

    public void setPosicaoJogador1(int x) {
        posicaoJogador1 = x;
    }

    public void setPosicaoJogador2(int x) {
        posicaoJogador2 = x;
    }

    public void setPontosJogador1(int x) {
        pontosJogador1 = x;
    }

    public void setPontosJogador2(int x) {
        pontosJogador2 = x;
    }

    public void init(BluetoothConnection btConnection){
        this.btConnection = btConnection;
    }

    protected void paint(Graphics g) {

        //pega altura e largura da tela
        int w = getWidth();
        int h = getHeight();

        //pinta um quadrado branco no fundo
        g.setColor(255,255,255);
        g.fillRect( 0,0,w,h );

        //desenha os pontos
        g.setColor(255,0,0);
        g.drawString("Pontos Jogador Vermelho - " + pontosJogador1, 10, 5, 0);
        g.setColor(0,0,255);
        g.drawString("Pontos Jogador Azul     - " + pontosJogador2, 10, 20, 0);

        //desenha o jogador 1
        g.setColor(255,0,0);
        //int posicao1 = ((w/2)-20)+(posicaoJogador1*10);
        posicao1 = ((w/2)-20)+(posicaoJogador1*10);
        //verifica se nao chegou no limite da tela
        if (posicao1 < 0) { posicao1 = ((w/2)-20)+((++posicaoJogador1)*10); }
        if (posicao1 > (w-40)) { posicao1 = ((w/2)-20)+((--posicaoJogador1)*10); }
        g.fillRect( posicao1 ,40,40,10 );

        //desenha o jogador 2
        g.setColor(0,0,255);
        //int posicao2 = ((w/2)-20)+(posicaoJogador2*10);
        posicao2 = ((w/2)-20)+(posicaoJogador2*10);
        //verifica se nao chegou no limite da tela
        if (posicao2 < 0) { posicao2 = ((w/2)-20)+((++posicaoJogador2)*10); }
        if (posicao2 > (w-40)) { posicao2 = ((w/2)-20)+((--posicaoJogador2)*10); }
        g.fillRect( posicao2 ,(h-20),40,10 );

        //desenha a bola

        if (inicio) {
            bolaX = w/2;
            bolaY = 0;
            tempoInicio--;
            if (tempoInicio < 0) {
                inicio=false;
            }
        }

        if (bolaY == 0) { bolaY = (h/2+20); }
        g.setColor(0,0,0);
        g.fillArc(bolaX, bolaY, 12, 12, 0, 360);

        if (isServidor && btConnection != null) {
            //envia posicao da bola
            btConnection.send("BOLA::"+bolaX+"||"+bolaY);
            //envia posicao do jogador1
            btConnection.send("JOGADOR1::"+posicaoJogador1);
            //envia pontos do jogador2
            btConnection.send("PONTOSJOGADOR2::"+pontosJogador2);
            //envia pontos do jogador1
            btConnection.send("PONTOSJOGADOR1::"+pontosJogador1);
        }

        if (isServidor == false && btConnection != null) {
            //envia posicao do jogador2
            btConnection.send("JOGADOR2::"+posicaoJogador2);
        }
    }

    public void commandAction(Command c, Displayable d) {
        System.out.println(c.toString());
    }
    
    public void keyPressed(int keyCode) {

        //controla a velocidade do jogador (esquerda e direita)
        if (isServidor) {
            if (keyCode == KEY_NUM4 || keyCode == -3) {
                posicaoJogador1--;
            } else if (keyCode == KEY_NUM6 || keyCode == -4) {
                posicaoJogador1++;
            }
        } else {
            if (keyCode == KEY_NUM4 || keyCode == -3) {
                posicaoJogador2--;
            } else if (keyCode == KEY_NUM6 || keyCode == -4) {
                posicaoJogador2++;
            }
            
        }
        //chama o repaint para atualizar a tela
        repaint();
    }

    public void run() {
        
        //pega altura e largura da tela
        int w = getWidth();
        int h = getHeight();

        //eixo X
        int direcao = bolaX;

        //eixo Y
        int velocidade = -10;

        while (true) {

            if (isServidor) {
                if (bolaY >= (h-32)) {
                    velocidade = -10;
                }
                if (bolaY <= 53) {
                    velocidade = +10;
                }
                bolaY += velocidade;

                 //controla colisão nas laterais
                if (bolaX < 0) {
                    direcao=1;
                }

                if (bolaX > (w-12)) {
                    direcao=-1;
                }

                //Controle de colisão com jogador 1
                //verifica se chegou no limite superior do eicho Y
                if (bolaY <= 53) {

                    //verifica se esta batendo no jogador1
                    if (bolaX >= (posicao1-5) && bolaX < (posicao1+40)) {

                        //muda a direcao da bola, de acordo onde bateu no jogador
                        if (bolaX >= (posicao1-5) && bolaX < posicao1+15) {
                            direcao=-1;
                            //System.out.println("Pegou no jogador - ESQUERDA");
                        }
                        if (bolaX >= (posicao1+15) && bolaX <= posicao1+25) {
                            direcao=0;
                            //System.out.println("Pegou no jogador - CENTRO");
                        }
                        if (bolaX > (posicao1+25) && bolaX < (posicao1+40)) {
                            direcao=+1;
                            //System.out.println("Pegou no jogador - DIREITA");
                        }
                    } else {
                        //System.out.println("Ponto jogador 2");
                        pontosJogador2++;
                        //recomeça jogo
                        inicio = true;
                        tempoInicio = 20;
                    }
                }

                //Controle de colisão com jogador 2
                //verifica se chegou no limite inferior do eicho Y
                if (bolaY >= (h-32)) {

                    //verifica se esta batendo no jogador2
                    //verifica se esta batendo no jogador1
                    if (bolaX >= (posicao2-5) && bolaX < (posicao2+40)) {

                        //muda a direcao da bola, de acordo onde bateu no jogador
                        if (bolaX >= (posicao2-5) && bolaX < posicao2+15) {
                            direcao=-1;
                            System.out.println("Pegou no jogador - ESQUERDA");
                        }
                        if (bolaX >= (posicao2+15) && bolaX <= posicao2+25) {
                            direcao=0;
                            System.out.println("Pegou no jogador - CENTRO");
                        }
                        if (bolaX > (posicao2+25) && bolaX < (posicao2+40)) {
                            direcao=+1;
                            System.out.println("Pegou no jogador - DIREITA");
                        }
                    } else {
                        System.out.println("Ponto jogador 1");
                        pontosJogador1++;
                        //recomeça jogo
                        inicio = true;
                        tempoInicio = 20;
                    }

                }

                bolaX += direcao;
            }
            repaint();

            try {
                Thread.sleep(80);
            } catch (InterruptedException ex) {
                ex.printStackTrace();
            }
           
        }
    }
}